#include <iostream>
#include <sstream>
#include <jsoncpp/json/json.h>

void unserialize(const std::string& str)
{
    // 实例化一个CharReaderBuilder工厂类
    Json::CharReaderBuilder crb;
    // 生产CharReader对象
    Json::CharReader *cr = crb.newCharReader();
    // 定义Jsonvalue对象存储
    Json::Value stu;
    std::string err;
    // 使用parse反序列化
    bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &stu, &err);
    if (ret == false)
    {
        std::cout << "json unserialize failed:" << err << std::endl;
        return;
    }

    // 逐个元素访问
    std::cout << "名字：" << stu["名字"].asString() << std::endl;
    std::cout << "年龄：" << stu["年龄"].asInt() << std::endl;
    int sz = stu["成绩"].size();
    for (int i = 0; i < sz; i++)
    {
        std::cout << "成绩: " << stu["成绩"][i].asFloat() << std::endl;
    }

    delete cr;
}

int main()
{
    // 序列化
    Json::Value stu;
    stu["名字"] = "zhangsan";
    stu["年龄"] = 19;
    stu["成绩"].append(77.5);
    stu["成绩"].append(82);
    stu["成绩"].append(88);

    // 实例化一个StreamWriterBuilder工厂类对象
    Json::StreamWriterBuilder swb;
    // 通过工厂对象生产一个StreamWriter对象
    Json::StreamWriter *sw = swb.newStreamWriter();
    // 使用StreamWriter对象对数据序列化
    std::stringstream ss;
    int ret = sw->write(stu, &ss);
    if (ret != 0)
    {
        std::cout << "json serialize failed!\n";
        return -1;
    }
    std::cout << ss.str() << std::endl;
    delete sw;

    unserialize(ss.str());
    return 0;
}

